package com.imooc.sell.utils.wang;

import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.imooc.sell.VO.wang.OutParamVO.AbstractOut;
import com.imooc.sell.enums.ErrorEnum;
import com.imooc.sell.expection.SellExpection;
import org.springframework.ui.Model;
import org.springframework.web.servlet.ModelAndView;

public class ResultUtils {
    /**
     * 默认跳转到的错误页面
     */
    private static final String DEFAULT_ERROR_PATH = "/wang/error/404";

    /**
     * 默认的空参数错误状态码
     */
    private static final Integer NULL_PARAM_CODE = 0;

    /**
     * 默认成功状态码
     */
    private static final Integer SUC_CODE = 1;

    /**
     * 默认空参数的错误信息
     */
    private static final String NULL_PARAM_MSG = "传入参数为空";

    /**
     * 默认成功信息
     */
    private static final String SUC_MSG = "成功";

    /**
     * 传入参数为空的返回函数
     *
     * @return Json字符串
     */
    public static String reFailJson() {
        JsonObject jsonObject = new JsonObject();
        jsonObject.addProperty("mcode", NULL_PARAM_CODE);
        jsonObject.addProperty("msg", NULL_PARAM_MSG);
        return jsonObject.toString();
    }

    /**
     * 返回错误码的Json
     *
     * @param mcode 状态码
     * @param msg   返回信息
     * @return 返回Json
     */
    public static String reFailJson(Integer mcode, String msg) {
        JsonObject jsonObject = new JsonObject();
        jsonObject.addProperty("mcode", mcode);
        jsonObject.addProperty("msg", msg);
        return jsonObject.toString();
    }

    /**
     * 返回无异常时的状态与信息
     *
     * @param t   传入的需要返回的对象参数
     * @param <T> 参数必须是继承了抽象输出类AbstractOut
     * @return Json
     */
    public static <T extends AbstractOut> String reSuccessJson(T t) {
        Gson reJson = new Gson();
        t.setMcode(SUC_CODE);
        t.setMsg(SUC_MSG);
        return reJson.toJson(t);
    }

    /**
     * 返回无异常时的状态与信息，不包含返回对象
     *
     * @return 成功的Json字符串
     */
    public static String reSuccessJson() {
        JsonObject jsonObject = new JsonObject();
        jsonObject.addProperty("mcode", SUC_CODE);
        jsonObject.addProperty("msg", SUC_MSG);
        return jsonObject.toString();
    }

    /**
     * 返回发生错误时的视图
     *
     * @param mcode 状态码
     * @param msg   状态信息
     * @param path  错误页面
     * @param model 存储对象的容器
     * @return 返回失败视图
     */
    public static ModelAndView reFailModelAndView(Integer mcode, String msg, String path, Model model) {

        model.addAttribute("mcode", mcode);
        model.addAttribute("msg", msg);
        return new ModelAndView(path);
    }

    /**
     * 返回默认error界面
     *
     * @param mcode 错误码
     * @param msg   错误信息
     * @param model model对象
     * @return 返回失败视图
     */
    public static ModelAndView reFailModelAndView(Integer mcode, String msg, Model model) {
        model.addAttribute("mcode", mcode);
        model.addAttribute("msg", msg);
        return new ModelAndView(DEFAULT_ERROR_PATH);
    }

    /**
     * 返回成功的订单列表视图
     *
     * @param key   返回对象名称
     * @param value 返回对象
     * @param path  视图路径
     * @param model 视图对象
     * @param <T>   模板方法
     * @return 返回成功视图
     */
    public static <T extends AbstractOut> ModelAndView reSuccessModelAndView(String key, T value, String path, Model model) {
        model.addAttribute("mcode", SUC_CODE);
        model.addAttribute("msg", SUC_MSG);
        model.addAttribute(key, value);
        return new ModelAndView(path);
    }

    /**
     * 返回分页订单列表(专用于分页查询返回)
     *
     * @param currePage 当前页
     * @param size      页面长度
     * @param value     返回对象
     * @param path      视图路径
     * @param model     视图对象
     * @param value     传入对象
     * @return 返回成功视图
     */
    public static ModelAndView reSuccessModelAndView(Integer currePage, Integer size, Object value, String path, Model model) {
        model.addAttribute("currentPage", currePage);
        model.addAttribute("size", size);
        model.addAttribute("pages", value);
        return new ModelAndView(path);
    }

    /**
     * 返回默认的成功状态码与信息
     *
     * @param path  返回成功的视图
     * @param model model
     * @return 成功视图
     */
    public static ModelAndView reSuccessModelAndView(String path, Model model) {
        model.addAttribute("mcode", SUC_CODE);
        model.addAttribute("msg", SUC_MSG);
        return new ModelAndView(path);
    }

    /**
     * 判断订单不存在，订单状态，以及支付状态异常
     *
     * @param se
     * @return
     */
    public static String reFailStatusJudge(SellExpection se) {
        if (se.getCode().equals(ErrorEnum.ORDER_NOT_EXIST.getCode())) {
            return reFailJson(2, "订单不存在");
        } else if (se.getCode().equals(ErrorEnum.ORDER_STATUS_ERROR.getCode())) {
            return reFailJson(3, "订单状态错误，当前订单不允许退款");
        } else {
            return reFailJson(4, "订单支付状态错误，当前订单不允许退款");
        }
    }

    public static ModelAndView reFailStatusJudgeModel(SellExpection se, Model model) {
        if (se.getCode().equals(ErrorEnum.ORDER_NOT_EXIST.getCode())) {
            return reFailModelAndView(2, "订单不存在", model);
        } else if (se.getCode().equals(ErrorEnum.ORDER_STATUS_ERROR.getCode())) {
            return reFailModelAndView(3, "订单状态错误，当前订单不允许退款", model);
        } else {
            return reFailModelAndView(4, "订单支付状态错误，当前订单不允许退款", model);
        }

    }
}
